﻿using System;
using System.Text;

namespace Trace
{
    /// <summary>
    /// Przykładowa implementacja klasy, która rejestruje ślad wykonania metod.
    /// </summary>
    public static class Trace
    {
        /// <summary>
        /// Rejestruje wejście do metody. 
        /// </summary>
        /// <param name="methodName">Nazwa metody</param>
        /// <param name="parameters">Kolekcja parametrów</param>
        public static void TraceEnter( string methodName, params ParameterInfo[] parameters )
        {
            Console.ForegroundColor = ConsoleColor.Green;
            StringBuilder sb = new StringBuilder();
            sb.AppendFormat( "Wejscie do metody {0}(", methodName );
            if ( parameters.Length > 0 )
            {
                for ( int i = 0; i < parameters.Length; ++i )
                {
                    if ( i != 0 )
                        sb.Append( ", " );

                    sb.AppendFormat( "{0} {1} = {2}", parameters[i].Type, parameters[i].Name, parameters[i].Value ?? "null" );
                }
            }
            sb.Append( ")" );
            Console.WriteLine( sb.ToString() );
            Console.ResetColor();
        }
        /// <summary>
        /// Rejestruje wyjście z metody, która zwraca wartość.
        /// </summary>
        /// <param name="methodName">Nazwa metody.</param>
        /// <param name="returnValue">Zwracana wartość.</param>
        /// <param name="returnParams">Parametry wyjściowe metody (out i ref).</param>
        public static void TraceLeave( string methodName, object returnValue, params ParameterInfo[] returnParams )
        {
            Console.ForegroundColor = ConsoleColor.Green;
            StringBuilder sb = new StringBuilder();
            sb.AppendFormat( "Wyjscie z metody {0} : {1}", methodName, returnValue );
            if ( returnParams.Length > 0 )
            {
                foreach ( ParameterInfo pInfo in returnParams )
                {
                    sb.AppendFormat( ", {0} {1} = {2}", pInfo.Type, pInfo.Name, pInfo.Value );
                }
            }
            Console.WriteLine( sb.ToString() );
            Console.ResetColor();
        }
        /// <summary>
        /// Rejestruje wyjście z metody, która nie zwraca wartości (jest typu void)
        /// </summary>
        /// <param name="methodName">Nazwa metody.</param>
        /// <param name="returnParams">Parametry wyjściowe metody (out i ref).</param>
        public static void TraceLeave( string methodName, params ParameterInfo[] returnParams )
        {
            Console.ForegroundColor = ConsoleColor.Green;
            StringBuilder sb = new StringBuilder();
            sb.AppendFormat( "Wyjscie z metody {0}", methodName );
            if ( returnParams.Length > 0 )
            {
                foreach ( ParameterInfo pInfo in returnParams )
                {
                    sb.AppendFormat( ", {0} {1} = {2}", pInfo.Type, pInfo.Name, pInfo.Value );
                }
            }
            Console.WriteLine( sb.ToString() );
            Console.ResetColor();
        }
    }
}
